<template>
  <div class="person">
    <h2>一辆{{ car.brand }}，价值{{ car.price }}</h2>
    <button @click="changeBrand">修改汽车的品牌</button>
    <button @click="changePrice">修改汽车的价格</button>
    <button @click="changeCar">修改汽车</button>
    <h2>当前求和为：{{ sum }}</h2>
    <button @click="changeSum">点我sum+1</button>
  </div>
</template>
<script lang="ts" setup name="Person234">
  // ref  ===> 可以定义：基本类型、对象类型的响应式数据 RefImpl  使用时需要.value 可以使用volar插件自动添加.value
  // reactive ===> 只能定义：对象类型的响应式数据 Proxy(Object) 重新分配一个新对象时会失去响应式 可以使用Object.assign去整体替换
  import {reactive, ref} from 'vue'
  // 使用原则：
  // 1.若需要一个基本类型的响应式数据，必须使用ref
  // 2.若需要一个响应式对象，层级不深，ref、reactive都可以
  // 3.若需要一个响应式对象，且层级较深，推荐使用reactive
  
  // 被reactive包裹后就变成了响应式对象
  let car = reactive({ brand: '奔驰', price: 100})
  let sum = ref(0)
  function changeBrand(){
    car.brand = '宝马'
  }
  function changePrice(){
    car.price += 10
  }
  function changeCar(){
    // car = { brand: '奥拓', price: 200}   // 这个写法不可以更新页面
    // car = reactive({ brand: '奥拓', price: 200})   // 这个写法不可以更新页面

    // 这个写法可以更新页面
    // car.brand = '宝马'
    // car.price = 200

    Object.assign(car, {brand: '奥拓', price: 200})
    // car.value = {brand: '奥拓', price: 200}
  }

  function changeSum(){
    sum.value += 1
    // sum = ref(9) 不可以这么写
  }

</script>

<style scoped>
    .person {
        background-color: #ddd;
        box-shadow: 0 0 10px;
        border-radius: 10px;
        padding: 20px;
    }
    button {
        margin: 0 5px;
    }
</style>
